iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
1
自我挑戰組

不要太認真學 Python! 之 我又重新報名了系列 第 29

不要太認真學 Python! - Day 32

  • 分享至 

  • xImage
  •  

[前情提要]

昨天真的解不出來到底要怎麼上人物。
有點沮喪啊。

https://ithelp.ithome.com.tw/upload/images/20191004/20120423lgR4cl3XNP.jpg

但是,冷靜過後還是充滿鬥志,因為憑著語感,感覺就是快成功了。

https://ithelp.ithome.com.tw/upload/images/20191004/20120423UjTLqWQAGu.jpg
https://ithelp.ithome.com.tw/upload/images/20191004/20120423Yd5WEWxUR2.jpg


一樣不囉唆,先上程式碼:

import pygame
import random
import os

pygame.init()

black = (0, 0, 0)
green = (91,231,196)
  
gameNaughtybox = pygame.display.set_mode((600,600))
pygame.Surface((600,600))
dest = (0,0)
Frame_per_seconds = 27

pygame.display.set_caption ("Naughty Box")

walkRight = [pygame.image.load('/Users/RGB/iThome/Naughty box music/cutegirlfiles/Walk (1).png'), 
                  pygame.image.load('/Users/RGB/iThome/Naughty box music/cutegirlfiles/Walk (2).png'), 
                  pygame.image.load('/Users/RGB/iThome/Naughty box music/cutegirlfiles/Walk (3).png'), 
                  pygame.image.load('/Users/RGB/iThome/Naughty box music/cutegirlfiles/Walk (4).png'), 
                  pygame.image.load('/Users/RGB/iThome/Naughty box music/cutegirlfiles/Walk (5).png')]
walkLeft = [pygame.image.load('Angel-1-7.png'), pygame.image.load('Angel-1-6.png')]
character=[pygame.image.load ('cutegirlfiles/Idle (1).png')]
bg = pygame.image.load('pipo-battlebg007b.png')
gameNaughtybox.blit(bg,(0,0))
pygame.display.flip()
    
x = 50
y = 50
width =64
height = 64
vel = 8
isJump = False
jumpCount = 15
left = False
right =False
walkCount = 0
run = True

clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def__init__(gameNaughtybox):
        pygame.sprite.Sprite.__init__(gameNaughtybox)
        gameNaughtybox.images= []
        img=pygame.image.load(os.path.join('cutegirlfiles/Idle (1).png')).convert()
        gameNaughtybox.images.append(img)
        gameNaughtybox.image= character.images[0]
        gameNaughtybox.rect  = character.image.get_rect()

def redrawGameWindow():
    global walkCount
    gameNaughtybox.blit(bg,(0,0))
    if walkCount + 1 >= Frame_per_seconds:
        walkCount = 0
    if left:
        gameNaughtybox.blit (walkLeft[walkCount//3], (x,y))
        walkCount +=1
    elif right:
        gameNaughtybox.blit (walkRight[walkCount//3], (x,y))
        walkCount +=1
    else:
        gameNaughtybox.blit(character)
                        
    pygame.display.update()

while run:
    gameNaughtybox.blit(bg,(x,0))
    x -= 1
    clock.tick(Frame_per_seconds)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False 

    keys = pygame.key.get_pressed()
    
    if keys [pygame.K_LEFT] and x > vel:
        x -= vel
        left = True
        right = False
        bg.scroll(5,0)
    elif keys [pygame.K_RIGHT] and x < 600 - width - vel:
        x += vel
        left = False
        right = True
        bg.scroll(-5,0)
    else:
        right = False
        left = False
        walkCount = 0
    
    if not (isJump):
        if keys [pygame.K_SPACE]:
            isJump = True
            right = False
            left = False
            walkCount = 0
    else:
        if jumpCount >= -10:
            neg = 1
            if jumpCount < 0:
                neg = -1
            y -= (jumpCount ** 2) * 0.5 * neg
            jumpCount -= 1
        else:
            isJump = False
            jumpCount = 10 
    redrawGameWindow()
    
pygame.quit()

今天的重點除了研究出怎麼上載角色以外,也精簡了人物的移動方式

本來是想說可以讓人物在整個遊戲框中到處跑。
但是,考量到這樣變數會很多,反而出錯率高,因此決定捨棄電腦上下鍵,人物僅能左右移動。

這對新手來說應該也蠻重要的,千萬別學我眼高手低。

https://ithelp.ithome.com.tw/upload/images/20191004/201204235AHxzRknPI.png

雖然我覺得是有可能成功,但就是需要時間去一直反覆檢查 if/else。如果初學者覺得特別玻璃心,一定要讓人物移動精簡,避免檢查太多變數消耗熱情。

雖然我覺得我的熱情並沒有被消耗掉啦 哈

精簡人物移動,只是把程式碼拿掉了,應該不用多做解釋。

但是,我仍然有留存,畢竟,以後還是想讓它移動!!!)激動拍桌

https://ithelp.ithome.com.tw/upload/images/20191004/20120423mtSyKNdwmo.png


好的,倒數第二天候補。
真的不知道怎麼能這麼不隨便寫文...
完全跟我的題目精神不符合啊)笑哭


重點還是放在角色上載這裡。

今天發現原來做遊戲真的不是想像中簡單,因為我今天居然發現 class 這個關鍵字。

原來,不是只是要把圖片上載這麼簡單,還要「分類」角色。以我的理解,就是每個遊戲都一定會有一個角色,只要是「角色」就會有很多變數要設定,譬如角色大小、起始位置、動作等等。

因此, class 這個關鍵字就是在替角色做分類。依照閱讀的資料理解,如果牽涉到多個角色,可能有些特徵會相似,因此會需要分類不同的角色。很多教程說這樣後續建置每個角色的動作會比較輕鬆,雖然我目前是感覺不出來啦...)賭氣

https://ithelp.ithome.com.tw/upload/images/20191004/20120423b5kr1bEcpJ.jpg

總之,我先想辦法整理成下面這段程式碼

class Player(pygame.sprite.Sprite):
    def__init__(gameNaughtybox):
        pygame.sprite.Sprite.__init__(gameNaughtybox)
        gameNaughtybox.images= []
        img=pygame.image.load(os.path.join('cutegirlfiles/Idle (1).png')).convert()
        gameNaughtybox.images.append(img)
        gameNaughtybox.image= character.images[0]
        gameNaughtybox.rect  = character.image.get_rect()

整段程式碼,我最不能理解的是 os.path 完全還沒時間搞懂那是什麼。

為什麼沒時間?

因為我正在試圖搞懂昨天說的關鍵字 雪碧... 額不是,是 sprite

我實在不能理解為什麼網路上的教學都是寫這樣 pygame.sprite.Sprite... 為什麼要寫兩個sprite,感覺很像跳針,完全不能理解這公式在寫什麼...

另外,sprite 後面似乎會伴隨著 rect,可是 rect 通常都是使用在向量方格上。但是,我又不是像最初那樣是要畫向量方格,如果要用圖片的話,就還在摸索要怎麼使用 rect

最後一個小問題。
其實我覺得這個是智商問題(小聲
True/False 看多了真的就覺得很混亂,到底現在是 True 還是 False,傻傻分不清楚啊。
不知道有沒有人有比較能清楚又快速的辨別方式?

https://ithelp.ithome.com.tw/upload/images/20191004/20120423rSmjvv35FD.jpg

我覺得這真的不是一天就能弄懂的。
應該要多看其他人的code,然後檢視自己的原始碼,然後必要的時候,放下錯誤,去加入新的挑戰,先挑戰其他小的項目,像是我做累了就想說來測試怎麼讓背景滾動。然後又再回頭思考主要的題幹,這樣才能一直保持熱情,也不會偏離航道太遠。

雖然看起來沒什麼內容,但是相較於昨天,真的有弄懂比較多架構和關鍵字的意思。

總之,收工!
明天繼續努力!!


不要太認真學 Python! - Day 31


上一篇
不要太認真學 Python! - Day 31
下一篇
不要太認真學 Python! - Day 33
系列文
不要太認真學 Python! 之 我又重新報名了31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言